package com.tengol.demo.design.pattern.structural.decorator.v2;

/**
 * 单元测试：装饰器模式
 * 业务场景：小明开了一个煎饼摊，每天来买煎饼的人络绎不绝，为了确保快速销售，小明制定了一些特定套餐：
 * 煎饼可以多加鸡蛋或香肠，鸡蛋1元一个，香肠2元一个
 * 1. 煎饼 8元一个，
 * 2. 煎饼多加一个鸡蛋 9元一个
 * 3. 煎饼多加一个鸡蛋多加一个香肠 11元一个
 * 4. 煎饼多加二个鸡蛋多加一个香肠 12元一个
 * 依次类推......
 *
 * 使用装饰器可以轻松解决此类问题：
 * 1. 原生核心类时煎饼及其功能
 * 2. 多加一个鸡蛋或多加一个香肠，本质上说是装饰性操作，对原生操作不影响
 * 3. 使用装饰器模式可以解决多加N个鸡蛋和多加N个香肠的操作（其中N取值0到无穷大）
 *
 * @author dongrui
 * @date 2019/03/06
 */
public class DecoratorTest {
    public static void main(String[] args) {
        //煎饼原套餐
        IBattercake battercake = new Battercake();
        printInfo(battercake);
        //煎饼多加一个鸡蛋
        battercake = new BattercakeDecoratorWithEgg(battercake);
        printInfo(battercake);
        //煎饼多加一个鸡蛋和香肠
        battercake = new BattercakeDecoratorWithSausage(battercake);
        printInfo(battercake);
        //煎饼多加二个鸡蛋和香肠
        battercake = new BattercakeDecoratorWithEgg(battercake);
        printInfo(battercake);
    }

    private static void printInfo(IBattercake battercake){
        System.out.println(battercake.getDesc() + " 销售价格：" + battercake.cost());
    }
}
